package com.ftwj.demo.utils.file;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

import org.apache.tika.Tika;
import org.apache.tika.exception.TikaException;
import org.apache.tika.language.LanguageIdentifier;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.parser.Parser;
import org.apache.tika.parser.microsoft.ooxml.OOXMLParser;
import org.apache.tika.parser.pdf.PDFParser;
import org.apache.tika.parser.txt.TXTParser;
import org.apache.tika.sax.BodyContentHandler;

import com.ftwj.demo.utils.logs.LoggerUtil;

/**
 * 
*
* <p>Title: TikaUtil</p>  
* <p>Description: 描述: Tika内容解析工具，支持普通文本，富文本，Office办公套件 ，PDF，Java的Jar或Class文件，图像，音频，视频等</p>
* <p>Copyright: Copyright (c) 2020 </p>  
* <p>Company: 兰州飞天网景信息产业有限公司</p>    
* @author WangSLi
* @date 2020年4月24日 上午11:29:06
* @version V1.0
 */
public class TikaUtil {
	
	/**
	 * 
	 * <p>Title: getFileType</p>  
	 * <p>Description: 根据文件路劲获取文件类型</p>  
	 * @param filePath
	 * @return 
	 * @author WangSLi
	 * @date 2020年4月24日  
	 * @version 1.0
	 */
	public static String getFileType(String filePath){
		File file = new File(filePath);
		try {
			Tika tika = new Tika();
			String fileType;
			fileType = tika.detect(file);
			return fileType;
		} catch (IOException e) {
			LoggerUtil.error("文件类型获取失败！",e);
		}
		return "";
	}
	
	/**
	 * 
	 * <p>Title: getContext</p>  
	 * <p>Description: 根据文件路径解析文件内容</p>  
	 * @param filePath
	 * @return 
	 * @author WangSLi
	 * @date 2020年4月24日  
	 * @version 1.0
	 */
	public static String getContext(String filePath){
		try {
			File file = new File(filePath);
			Tika tika = new Tika();
			String filecontent = tika.parseToString(file);
			LoggerUtil.info("【输出文件内容】: {}" , filecontent);
			return filecontent;
		} catch (Exception e) {
			LoggerUtil.error("文件内容解析失败！",e);
		}
		return "";
		 
	}

	/**
	 * <p>Title: parse</p>  
	 * <p>Description: 根据文件路径获取对文件进行语言检测</p>  
	 * @param filePath
	 * @param limit
	 * @return
	 * @throws Exception 
	 * @author WangSLi
	 * @date 2020年4月24日  
	 * @version 1.0
	 */
	@Deprecated
	public static String LanguageDetection(String filePath) {
		try {
			Parser parser = new AutoDetectParser();
			BodyContentHandler handler = new BodyContentHandler();
			Metadata metadata = new Metadata();
			FileInputStream content = new FileInputStream(new File(filePath));
			//Parsing the given document
			parser.parse(content, handler, metadata, new ParseContext());
			LanguageIdentifier object = new LanguageIdentifier(handler.toString());
			LoggerUtil.info("预言检测:" + object.getLanguage());
			return object.getLanguage();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "";
    }
	
	/**
	 * <p>Title: parse</p>  
	 * <p>Description: 根据文件路径解析pdf文件为字符串</p>  
	 * @param filePath
	 * @param limit
	 * @return
	 * @throws Exception 
	 * @author WangSLi
	 * @date 2020年4月24日  
	 * @version 1.0
	 */
	public static String parsePdf(String filePath){
		try {
			BodyContentHandler handler = new BodyContentHandler();
			Metadata metadata = new Metadata();
			FileInputStream inputstream = new FileInputStream(new File(filePath));
			ParseContext pcontext = new ParseContext();
			//parsing the document using PDF parser
			PDFParser pdfparser = new PDFParser();
			pdfparser.parse(inputstream, handler, metadata,pcontext);
			//getting the content of the document
			LoggerUtil.info("【输出文件内容】：\n{}" + handler.toString());
			return handler.toString();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "";
    }

	/**
	 * <p>Title: parse</p>  
	 * <p>Description: 根据文件路径解析txt文件为字符串</p>  
	 * @param filePath
	 * @param limit
	 * @return
	 * @throws Exception 
	 * @author WangSLi
	 * @date 2020年4月24日  
	 * @version 1.0
	 */
	public static String parseTxt(String filePath){
		try {
			BodyContentHandler handler = new BodyContentHandler();
			Metadata metadata = new Metadata();
			FileInputStream inputstream = new FileInputStream(new File(filePath));
			ParseContext pcontext=new ParseContext();
			//Text document parser
			TXTParser TexTParser = new TXTParser();
			TexTParser.parse(inputstream, handler, metadata,pcontext);
			LoggerUtil.info("【输出文件内容】：\n{}" + handler.toString());
			return handler.toString();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "";
    }

	/**
	 * <p>Title: parse</p>  
	 * <p>Description: 根据文件路径解析excel文件为字符串</p>  
	 * @param filePath
	 * @param limit
	 * @return
	 * @throws Exception 
	 * @author WangSLi
	 * @date 2020年4月24日  
	 * @version 1.0
	 */
	public static String parseExcel(String filePath){
		try {
			BodyContentHandler handler = new BodyContentHandler();
			Metadata metadata = new Metadata();
			FileInputStream inputstream = new FileInputStream(new File(filePath));
			ParseContext pcontext=new ParseContext();
			OOXMLParser msofficeparser = new OOXMLParser ();
			msofficeparser.parse(inputstream, handler, metadata,pcontext);
			LoggerUtil.info("【输出文件内容】：\n{}" + handler.toString());
			return handler.toString();	
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "";
    }
    
	/**
	 * <p>Title: parse</p>  
	 * <p>Description: 根据文件路径解析文件为字符串</p>  
	 * @param filePath
	 * @param limit
	 * @return
	 * @throws Exception 
	 * @author WangSLi
	 * @date 2020年4月24日  
	 * @version 1.0
	 */
	public static String parse(String filePath) throws Exception{
        return parse(filePath,10*1024*1024);
    }
	
	/**
	 * 
	 * <p>Title: parse</p>  
	 * <p>Description: </p>  
	 * @param filePath 文件路径
	 * @param limit 最大解析字符的个数
	 * @return
	 * @throws Exception 
	 * @author WangSLi
	 * @date 2020年4月24日  
	 * @version 1.0
	 */
    public static String parse(String filePath, int limit) throws Exception{
        File file=new File(filePath);
        BodyContentHandler handler = new BodyContentHandler(limit);
        Metadata meta=new Metadata();
        meta.set(Metadata.CONTENT_ENCODING, "utf-8");
        meta.set(Metadata.RESOURCE_NAME_KEY, file.getName());
        FileInputStream input=new FileInputStream(file);
        ParseContext context=new ParseContext();
        new AutoDetectParser().parse(input,handler,meta,context);
        String[] names = meta.names();
        LoggerUtil.info("【文件数据源信息】：");
		for(String name : names) {
			LoggerUtil.info(name+ " : " + meta.get(name));
		}
        String filecontent=handler.toString();
        LoggerUtil.info("【输出文件内容】：\n{}" , filecontent);
        return filecontent;
    }

    public static void main(String[] args) throws Exception {
        String res = TikaUtil.parse("D:\\Users\\Frencis\\git\\spring-boot-module-demo\\spring-boot-utils\\src\\main\\java\\com\\ftwj\\demo\\utils\\file\\FileTypeUtil.java");
        //System.out.println(res);
    }
    
}
